/**
 * @author 0283000115
 * @date 2017年9月26日-上午9:42:43
 */
package com.zte.claa.inficombo.csa.app.comm.csif;

import org.apache.mina.core.future.WriteFuture;

import com.zte.claa.inficombo.csa.app.config.CSIFCmdCodeProps;
import com.zte.claa.inficombo.csa.app.config.CSIFCommProps;
import com.zte.claa.inficombo.csa.app.model.app.AppTarget;
import com.zte.claa.inficombo.csa.app.service.redis.CSAMessagePublisher;

/**
 * @author 0283000115
 *
 */
public interface CSIFCommService {
	// CONNECT状态。
	public static final int CONN_STATUS_IDLE  = 1;
	public static final int CONN_STATUS_CLOSE = 2;
	
	/**
	 * 建立到CSIF的连接 （tcp长链）
	 * 
	 * @throws Exception
	 */
	public void connectToCSIF() throws Exception;
	
	/**
	 * 关闭到CSIF的连接
	 * 
	 * 异常或系统退出时调用。
	 */
	public void closeConnectToCSIF();
	
	/**
	 * 判断是否已经连接到CSIF： true--已经连接；false--未连接；
	 * @return
	 */
	public boolean hasConnectToCSIF();
	
	/**
	 * 向CSIF认证（同步模式）.
	 * 
	 */
	public String authToCSIF() throws Exception;
	
	/**
	 * 向CSIF认证（异步模式）.
	 * 
	 */
	public void authToCSIFByAsynMode() throws Exception;
	
	/**
	 * 获取appteget
	 * @return
	 */
	public AppTarget getAppTarget();
	
	/**
	 * 同步方式执行命令.
	 * 
	 * @param cmd
	 * @return 命令响应的string（json）
	 * @throws Exception
	 */
	public String execCommand(CSIFCommand cmd) throws Exception;
	
	/**
	 * 执行命令不关注响应.
	 * 
	 * @param jsonCmd
	 * @return 命令响应的string（json）
	 * @throws Exception
	 */
	public WriteFuture execCommandIngoreRsp(CSIFCommand cmd) throws Exception;
	
	/**
	 * 执行命令不关注响应.
	 * 
	 * @param jsonCmd
	 * @return 命令响应的string（json）
	 * @throws Exception
	 */
	public WriteFuture execCommandIngoreRsp(String jsonCmd) throws Exception;
	
	/**
	 * 上报消息
	 * 
	 * @param msg
	 */
	public void reportMessage(String msg);
	
	/**
	 * 上报异常
	 * 
	 * @param jsonMsg
	 */
	public void reportException(Throwable cause);
	
	/**
	 * 上报消息
	 * 
	 * @param jsonMsg
	 */
	public void reportConnectStatus(int status);
	
	/**
	 * 设置链路重连监听（通知应用层重新下发appeui的注册命令等）；
	 * 
	 * @param listener
	 */
	public void setReconnectListener(CSIFConnReconnectListener listener);
	
	/**
	 * 设置数据上报监听器.
	 * 
	 * @param listener
	 */
	public void setReportDataListener(CSIFReportDataListener listener);
	
	// 设置命令码配置参数
	public void setCSIFCmdCodeProps(CSIFCmdCodeProps csifCmdCodeProps);
	
	// 设置csif通讯参数.
	public void setCSIFCommProps(CSIFCommProps csifCommProps);
	
	/**
	 * 日志发布（主要是csif返回的异步ack响应信息）
	 * @param logPublisher
	 */
	public void setLogPublisher(CSAMessagePublisher logPublisher);
	
}
